<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Copy</title>
    <script>
        //浅拷贝：基本属性拷贝值，引用拷贝内存。利用循环依次将老内容拷贝到新当中。
        /* function cCopy(oldObj){//传入的是被拷贝的对象
            var newObj={};//用于接收拷贝的内容
            for(var k in oldObj){//依次循环oldObj中所有内容，依次拷到newObj当中
                newObj[k]=oldObj[k];
            }
            return newObj;
        }
        var user = { name: "John" };
        var user2 = cCopy(user);
        console.log("被拷贝的");
        console.log(user);
        console.log("拷贝的");
        console.log(user2);  */

        /* 深拷贝：基本属性拷贝值，引用也是拷贝值，会创造一个新的内存，新旧不再像浅拷贝那样共享内存
        这时候循环就需要考虑到属性的类型，简单数据类型直接返回(参考浅拷贝)，如果是Array和Object类型，
        需要进行层层递归，其中数组需要进行遍历 */
        function bCopy(oldObj){//传入的是被拷贝的对象
            var newObj;//用于接收拷贝的内容
            if(oldObj instanceof Object){//要拷贝的是Object，递归，转成基本属性后再用newObj=oldObj返回
                newObj={};
                for(var k in oldObj){
                    newObj[k]=bCopy(oldObj[k]);//递归
                }
            }
            else if(oldObj instanceof Array){//要拷贝的是Array，数组需要遍历，利用forEach函数
                newObj=[];
                oldObj.forEach(item => {//对每一个遍历的item再进行bCopy操作，和上面的Object类似
                newObj = bCopy(item)
                });
            }
            else {
                newObj=oldObj;//其它的基本属性，直接拷贝即可
            }
            return newObj;
        }
        var user = { name: "John" };
        var user2 = bCopy(user);
        console.log("被拷贝的");
        console.log(user);
        console.log("拷贝的");
        console.log(user2); 
    </script>
</head>
<body>
    
</body>
</html>